Análisis del conjunto de datos iNaturalist

En primer lugar importamos las librerías necesarias.

Definimos una función para mostrar las imágenes del conjunto de datos.

Definimos las rutas de los datos, pesos y archivos de destino.

Cargamos nuestro conjunto de datos obtenido de la plataforma iNaturalist con las categorías a diferentes niveles de especificación, número de observaciones y URLs por especie.

Definimos una función para ordenar de forma descentente los datos por cantidad de observaciones.

Mostramos las categorías Orden de forma descentente.

Mostramos las categorías Familia de forma descentente.

Mostramos las categorías Subfamilia de forma descentente.

Mostramos las categorías Orden de forma descentente.

Mostramos las categorías Especie de forma descentente.

Seleccionamos las 1000 especies con más observaciones para formar el conjunto de datos completo.

Observamos el número de clases por categoría jerárquica.

Seleccionamos las tres familias con más observaciones para conformar el conjunto de datos reducido.

Seleccionamos las especies de nuestro conjunto de datos que corresponden a estas familias seleccionadas.

Observamos el número de clases por categoría jerárquica.

Observamos un considerable desbalanceo, por lo que tendremos que tenerlo en cuenta posteriormente.

Buscamos valores perdidos.

Podemos observar que solo existen valores perdidos en la categoría Subfamilia, sin embargo, esto se debe a que no todas las especies presentan este nivel de especificación, por lo que no se debe considerar como valor perdido, pero tampoco se usará para predecir.

Guardamos estos conjuntos seleccionados.

Limpieza del conjunto de datos

Una vez descargadas las imágenes con las URLs del conjunto de datos seleccionado procedemos a comprobar si existen imágenes corruptas y eliminar de este conjunto.

Gestionando del desbalanceo de clases

Como vimos anteriormente, existe un desbalanceo considerable entre clases, por lo que trataremos estre desbalanceo con particiones estratificadas y pesos de importancia por clase.

Conjunto de datos completo

Cargamos el conjunto de datos completo.

Creamos las particiones estratificadas con la función _train_test_split_ de Scikit-Learn.

Guardamos esta separación de particiones estratificadas en un nuevo CSV.

Observamos el número de clases por especie de forma gráfica.

Observamos el número de clases por orden de forma gráfica.

Observamos el número de clases por familia de forma gráfica.

Observamos el número de clases por género de forma gráfica.

Generamos los pesos de importancia por clase con la función _compute_class_weight_ de Scikit-Learn. De esta forma podremos posteriormente dar más importancia a las clases que tienen menos ejemplos en la función de pérdida y así reducir el impacto del desbalanceo durante el entrenamiento.

Generamos los pesos para el nivel de especificación familia.

Generamos los pesos para el nivel de especificación género.

Generamos los pesos para el nivel de especificación orden.

Conjunto de datos reducido

Realizamos el mismo proceso con el conjunto de datos reducido.